/*
*************************************************
				Copyagent
	------------------------------------------
	            baza_date.c
*************************************************
Adauga suport pentru interactiunea cu baza de date
*/
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <mysql/mysql.h>
#include "crawler_lib.h"


MYSQL mysql;
MYSQL_RES *res;
MYSQL_ROW row; 



/*
int insert_cuvint_into_db(char * cuvant, int id_prop);
-------------------------------------------------
Insereaza un cuvant din propozitia id_prop in baza de date
-------------------------------------------------
char * cuvant: cuvantul
int id_prop: id-ul propozitiei din care face parte cuvantul
return int: id-ul propozitiei
*/
int insert_cuvint_into_db(char * cuvant, int id_prop)
{
	int ret_value;
	if (strlen(cuvant) > FILENAME_LENGTH)
		return -1;
	if (id_prop < 0)
		return -1;
	char query[DB_QUERY_MAX_LEN]; 
	sprintf(query,"INSERT into copyagent.cuvinte (cuvant , prop_id) VALUES ('%s','%d')", cuvant, id_prop); 
	ret_value = mysql_query(&mysql,query);
	if (ret_value != 0 )
	{
		printf("%s \n",mysql_error(&mysql));
		fflush(stdout);
	}
	return ret_value;
   
}

/*
void sparge_prop_in_cuvinte(char * unit,int id_prop);
-------------------------------------------------
Introduce cuvintele din propozitia unit in tabela de cuvinte.
Fiecare cuvant va pastra si id-ul propozitiei din care provine
------------------------------
char * unit: propozitia din care trebui extrase cuvintele
int id_prop: id-ul propozitiei
*/
void sparge_prop_in_cuvinte(char * unit,int id_prop)
{
	char * propozitie = (char *)(malloc(FILENAME_LENGTH));
	char * tokeni = (char *)(malloc(13));
	char * cuvant;

	if (unit == NULL)
		return;
	sprintf(tokeni,"'\".,;-:)(}{/ ");
	if( strlen(unit) > FILENAME_LENGTH )
		return;
	strcpy(propozitie, unit);

	cuvant = strtok (propozitie,tokeni);
	while (cuvant != NULL)
	{
		if  (strlen (cuvant) > LUNG_MIN_CUV)
		{
			insert_cuvint_into_db(cuvant, id_prop);
			
		}
		cuvant = strtok (NULL,tokeni);
	}
	return ;

	
}
/*
int insert_prop_into_db(char * prop, char * url);
-------------------------------------------------
Insereaza o propozitie de la o adresa URL in baza de date
-------------------------------------------------
char * prop: propozitia care a fost gasita
char * url: adresa la care a fost gasita
MYSQL mysql: baza de date in care se stocheaza informatia
return int: id-ul propozitiei
*/
int insert_prop_into_db(char * prop, char * url)
{
	int ret_value;
	replaceChars(prop,'\'','_');
	if (strlen(url) > FILENAME_LENGTH)
		return -1;
	if (strlen(prop) > FILENAME_LENGTH)
		return -1;
	char query[DB_QUERY_MAX_LEN]; 
	sprintf(query,"INSERT into copyagent.aparitii (propozitie, domeniu, url_complet, data_propozitie) VALUES ('%s','%s','%s', NOW())", prop, extrageHostDinURL(url), url); 
   	ret_value = mysql_query(&mysql,query);
	if (ret_value != 0 )
	{
		printf("%s \n",mysql_error(&mysql));
		fflush(stdout);
	}
	ret_value = mysql_insert_id(&mysql);
   	return ret_value;
   
}

/*
int mysql_connection_start()
-------------------------------------------------
Initiaza conexiunea la serverul Mysql
-------------------------------------------------
return int: 0 daca s-a initiat cu succes, !=0 altfel
*/
int mysql_connection_start()
{
	

	mysql_init(&mysql);
	if (!mysql_real_connect(&mysql,"10.0.0.1","copyagent","pentium2",NULL/*variation #2*/,0,NULL,0)) 
	{
		printf( "Failed to connect to MySQL: Error: %s\n", mysql_error(&mysql));
		fflush(stdout);
		return 1;
	}
	return 0;
}

/*
int mysql_connection_end()
-------------------------------------------------
Inchide conexiunea la serverul Mysql
-------------------------------------------------
*/
void mysql_connection_end()
{
	mysql_close(&mysql);
}


/*
int sparge_prop_bufferul_pentru_bd(char * buffer, char  * current_url);
-------------------------------------------------
Sparge bufferul in unitati de propozitii.
Separarea se face in functie de US - unit separator.
Unitatile rezultate se pun pe cate o linie noua in fisierul destinatie.
Rezultatul este 0 daca spargerea s-a facut cu succes. Diferit de 0 atlfel.
-------------------------------------------------
char * buffer:	buffer-ul de spart
char * current_url: url-ul din care a fost extrasa propozitia
return int:	0 daca totul a fost in regula. !=0 altfel
*/
int sparge_prop_bufferul_pentru_bd(char * buffer, char  * current_url)
{

	char * unit;
	char * tokeni = (char *)(malloc(2));
	sprintf(tokeni,"%c.",US);
	int id_prop = 0;
	
	unit = strtok (buffer,tokeni);
	while (unit != NULL)
	{
		if  (strlen (unit) > LUNG_MIN_PROP)
		{
			id_prop = insert_prop_into_db(unit, current_url);
			if (id_prop > 0)
				sparge_prop_in_cuvinte(unit, id_prop);
		}
		unit = strtok (NULL,tokeni);
	}
	return 0;
}
